const apiModule = require('../../utils/api/index');
const api = require('../../utils/api');

Page({
  data: {
    currentDate: '',
    showDatePickerModal: false,
    currentTab: 'staple', // 添加当前标签页状态
    
    // 营养摄入目标和实际值
    calories: 0,
    caloriesTarget: 0,
    caloriesPercentage: 0,
    
    carbs: 0,
    carbsTarget: 0,
    carbsPercentage: 0,
    
    protein: 0,
    proteinTarget: 0,
    proteinPercentage: 0,
    
    fat: 0,
    fatTarget: 0,
    fatPercentage: 0,
    
    // 餐食列表
    meals: [],
    loading: false,
    
    // 膳食建议
    recommendation: '根据您今日的饮食记录，我们建议您增加蛋白质的摄入，并减少精制碳水化合物。考虑添加更多蔬菜和纤维到您的饮食中，以帮助控制血糖。',
    
    // 食物推荐
    loadingFoodRecommendations: false,
    stapleRecommendations: [], // 主食推荐
    proteinRecommendations: [], // 蛋白质食物推荐
    vegetableRecommendations: [], // 蔬菜推荐
    nutritionDeficit: {}, // 营养素缺口
    foodRecommendationTips: [], // 饮食建议
    
    // GI值解释弹窗
    showGIExplanation: false
  },
  
  onLoad() {
    // 设置当前日期
    this.setCurrentDate();
    // 加载食物推荐
    this.loadFoodRecommendations();
  },
  
  onShow() {
    // 更新底部TabBar选中状态
    if (typeof this.getTabBar === 'function' && this.getTabBar()) {
      this.getTabBar().setData({
        selected: 1
      });
    }
    
    // 加载用户个性化营养目标 - 从onLoad移到onShow，确保每次进入页面都更新
    this.loadNutritionTargets();
    
    // 加载今日餐食数据
    this.loadTodayMeals();
  },
  
  // 设置当前日期
  setCurrentDate() {
    const today = new Date();
    const year = today.getFullYear();
    const month = String(today.getMonth() + 1).padStart(2, '0');
    const day = String(today.getDate()).padStart(2, '0');
    
    this.setData({
      currentDate: `${year}-${month}-${day}`
    });
  },
  
  // 显示日期选择器
  showDatePicker() {
    this.setData({
      showDatePickerModal: true
    });
  },
  
  // 隐藏日期选择器
  hideDatePicker() {
    this.setData({
      showDatePickerModal: false
    });
  },
  
  // 日期变更事件
  onDateChange(e) {
    const selectedDate = e.detail.value;
    
    this.setData({
      currentDate: selectedDate
    });
    
    // 加载所选日期的数据
    this.loadTodayMeals();
    // 重新加载食物推荐
    this.loadFoodRecommendations();
  },
  
  // 加载餐食数据
  async loadTodayMeals() {
    try {
      this.setData({ loading: true });
      const result = await apiModule.diet.getMealsByDate(this.data.currentDate);
      
      if (result && result.success) {
        const meals = result.data;
        console.log('获取到的餐食数据:', meals);
        
        // 处理餐食数据
        const processedMeals = this.processMeals(meals);
        console.log('处理后的餐食数据:', processedMeals);
        
        // 计算营养总量
        const nutrition = this.calculateNutrition(meals);
        console.log('计算得到的营养总量:', nutrition);
        
        // 更新状态
        this.setData({
          meals: processedMeals,
          calories: nutrition.calories,
          carbs: nutrition.carbs,
          protein: nutrition.protein,
          fat: nutrition.fat
        });
        
        // 计算营养摄入百分比
        this.calculateNutritionPercentages();
      }
    } catch (error) {
      console.error('加载餐食数据失败:', error);
      wx.showToast({
        title: '加载数据失败',
        icon: 'none'
      });
    } finally {
      this.setData({ loading: false });
    }
  },
  
  // 加载食物推荐
  async loadFoodRecommendations() {
    this.setData({ loadingFoodRecommendations: true });
    
    try {
      // 获取当前日期，确保和餐食记录使用相同日期
      const date = this.data.currentDate;
      const result = await apiModule.food.getFoodRecommendations({ date });
      
      console.log('获取食物推荐响应:', result);
      
      if (result && result.success && result.data) {
        const { 
          nutritionDeficit, 
          stapleRecommendations, 
          proteinRecommendations, 
          vegetableRecommendations,
          suggestions
        } = result.data;
        
        // 处理食物推荐数据显示
        const processStaples = this.processRecommendationDisplay(stapleRecommendations);
        const processProteins = this.processRecommendationDisplay(proteinRecommendations);
        const processVegetables = this.processRecommendationDisplay(vegetableRecommendations);
        
        this.setData({
          stapleRecommendations: processStaples,
          proteinRecommendations: processProteins,
          vegetableRecommendations: processVegetables,
          nutritionDeficit,
          foodRecommendationTips: suggestions || [],
          hasNutritionDeficit: this.checkIfHasDeficit(nutritionDeficit)
        });
      } else {
        console.warn('食物推荐数据格式不正确或为空');
        // 设置默认示例数据
        this.setDefaultRecommendations();
      }
    } catch (error) {
      console.error('加载食物推荐失败:', error);
      // 设置默认示例数据
      this.setDefaultRecommendations();
    } finally {
      this.setData({ loadingFoodRecommendations: false });
    }
  },
  
  // 处理推荐食物显示格式
  processRecommendationDisplay(foods) {
    if (!foods || !Array.isArray(foods)) return [];
    
    return foods.map(food => {
      // 确保nutrition存在
      const nutrition = food.nutrition || {};
      
      // 格式化推荐份量显示
      let portionText = '';
      if (food.recommendedPortion) {
        portionText = `${food.recommendedPortion}克`;
      }
      
      // 格式化标签，添加CSS类名
      const tags = Array.isArray(food.tags) ? food.tags : [];
      const formattedTags = tags.map(tag => {
        let cssClass = '';
        
        // 根据标签内容添加特定类名
        if (tag.includes('低GI') || tag.includes('血糖上升缓慢')) {
          cssClass = 'tag-gi-low';
        } else if (tag.includes('蛋白')) {
          cssClass = 'tag-protein';
        } else if (tag.includes('纤维')) {
          cssClass = 'tag-fiber';
        }
        
        return {
          text: tag,
          cssClass
        };
      });
      
      // 格式化推荐理由
      const reasons = Array.isArray(food.reasons) ? food.reasons : [];
      
      // 计算这份食物提供的营养比例
      let nutritionPercentage = '';
      if (food.percentOfDeficit) {
        nutritionPercentage = `(满足缺口的${Math.round(food.percentOfDeficit)}%)`;
      }
      
      return {
        ...food,
        formattedPortion: portionText,
        formattedTags: formattedTags,
        formattedReasons: reasons,
        nutritionPercentage,
        // 确保营养素值为数字
        nutrition: {
          calories: parseFloat(nutrition.calories) || 0,
          carbs: parseFloat(nutrition.carbs) || 0,
          protein: parseFloat(nutrition.protein) || 0,
          fat: parseFloat(nutrition.fat) || 0,
          fiber: parseFloat(nutrition.fiber) || 0
        }
      };
    });
  },
  
  // 检查用户是否有营养素缺口
  checkIfHasDeficit(nutritionDeficit) {
    if (!nutritionDeficit) return false;
    
    return nutritionDeficit.calories > 100 || 
           nutritionDeficit.protein > 10 || 
           nutritionDeficit.carbs > 20 || 
           nutritionDeficit.fiber > 5;
  },
  
  // 设置默认食物推荐数据
  setDefaultRecommendations() {
    this.setData({
      stapleRecommendations: [
        {
          name: '红薯',
          giValue: 54,
          nutrition: {
            calories: 86,
            carbs: 20.1,
            protein: 1.6,
            fat: 0.1,
            fiber: 3
          },
          benefits: ['低GI值', '富含维生素A', '富含膳食纤维']
        },
        {
          name: '燕麦片',
          giValue: 55,
          nutrition: {
            calories: 379,
            carbs: 66,
            protein: 16.9,
            fat: 6.9,
            fiber: 10.6
          },
          benefits: ['富含膳食纤维', '富含蛋白质', '有助于降低胆固醇']
        },
        {
          name: '全麦面包',
          giValue: 50,
          nutrition: {
            calories: 247,
            carbs: 41,
            protein: 13,
            fat: 3.4,
            fiber: 7
          },
          benefits: ['低GI值', '富含膳食纤维', '比白面包更不易升高血糖']
        }
      ],
      proteinRecommendations: [
        {
          name: '鸡胸肉',
          giValue: 0,
          nutrition: {
            calories: 165,
            carbs: 0,
            protein: 31,
            fat: 3.6,
            fiber: 0
          },
          benefits: ['优质蛋白质来源', '低脂肪', '几乎不含碳水化合物']
        },
        {
          name: '豆腐',
          giValue: 15,
          nutrition: {
            calories: 76,
            carbs: 1.9,
            protein: 8,
            fat: 4.8,
            fiber: 0.3
          },
          benefits: ['植物性蛋白质', '低碳水化合物', '含有异黄酮']
        }
      ],
      vegetableRecommendations: [
        {
          name: '西兰花',
          giValue: 15,
          nutrition: {
            calories: 34,
            carbs: 6.6,
            protein: 2.8,
            fat: 0.4,
            fiber: 2.6
          },
          benefits: ['富含维生素C', '富含膳食纤维', '低碳水化合物']
        },
        {
          name: '菠菜',
          giValue: 15,
          nutrition: {
            calories: 23,
            carbs: 3.6,
            protein: 2.9,
            fat: 0.4,
            fiber: 2.2
          },
          benefits: ['富含铁质', '富含叶酸', '低卡路里']
        }
      ],
      foodRecommendationTips: [
        {
          type: 'general',
          content: '糖尿病患者应优先选择低GI值食物，控制主食量'
        },
        {
          type: 'meal_order',
          content: '建议先吃蔬菜和蛋白质食物，最后吃主食，有助于控制餐后血糖波动'
        }
      ]
    });
  },
  
  // 显示GI值解释弹窗
  showGIExplanationModal() {
    this.setData({
      showGIExplanation: true
    });
  },
  
  // 隐藏GI值解释弹窗
  hideGIExplanationModal() {
    this.setData({
      showGIExplanation: false
    });
  },
  
  // 处理餐食数据，转换为UI呈现格式
  processMeals(mealsData) {
    if (!mealsData || !Array.isArray(mealsData)) return [];
    
    // 餐食类型对应的图标
    const typeIcons = {
      '早餐': '🍳',
      '午餐': '🍚',
      '晚餐': '🥗',
      '加餐': '🍎'
    };
    
    return mealsData.map(meal => ({
      id: meal._id,
      type: meal.mealType,
      time: meal.time,
      icon: typeIcons[meal.mealType] || '🍽️',
      calories: meal.totalCalories,
      foods: meal.foods ? meal.foods.map(food => food.name) : []
    }));
  },
  
  // 计算营养总量
  calculateNutrition(mealsData) {
    if (!mealsData || !Array.isArray(mealsData)) {
      return { calories: 0, carbs: 0, protein: 0, fat: 0 };
    }
    
    const totals = mealsData.reduce((acc, meal) => {
      acc.calories += meal.totalCalories || 0;
      acc.carbs += meal.totalCarbs || 0;
      acc.protein += meal.totalProtein || 0;
      acc.fat += meal.totalFat || 0;
      return acc;
    }, { calories: 0, carbs: 0, protein: 0, fat: 0 });
    
    // 格式化营养素数据，卡路里取整，其他保留一位小数
    return {
      calories: Math.round(totals.calories),
      carbs: Math.round(totals.carbs * 10) / 10,
      protein: Math.round(totals.protein * 10) / 10,
      fat: Math.round(totals.fat * 10) / 10
    };
  },
  
  // 跳转到添加餐食页面
  navigateToAddMeal() {
    wx.navigateTo({
      url: `../dietAdd/dietAdd?date=${this.data.currentDate}`,
      fail: (error) => {
        console.error('跳转失败', error);
        wx.showToast({
          title: '功能开发中',
          icon: 'none',
          duration: 2000
        });
      }
    });
  },
  
  // 跳转到餐食详情页面
  navigateToMealDetail(e) {
    const mealId = e.currentTarget.dataset.id;
    if (!mealId) return;
    
    wx.navigateTo({
      url: `../dietDetail/dietDetail?id=${mealId}`,
      fail: (error) => {
        console.error('跳转失败', error);
        wx.showToast({
          title: '功能开发中',
          icon: 'none',
          duration: 2000
        });
      }
    });
  },
  
  // 跳转到食谱列表页面
  navigateToRecipes() {
    wx.navigateTo({
      url: '../recipes/recipes',
      fail: (error) => {
        console.error('跳转失败', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none',
          duration: 2000
        });
      }
    });
  },
  
  // 跳转到食谱详情页面
  async navigateToRecipeDetail(e) {
    const recipeId = e.currentTarget.dataset.id;
    if (!recipeId) return;
    
    // 直接跳转到食谱详情页
    wx.navigateTo({
      url: `../recipeDetail/recipeDetail?id=${recipeId}`,
      fail: (error) => {
        console.error('跳转到食谱详情页失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none',
          duration: 2000
        });
      }
    });
  },
  
  // 刷新膳食建议
  refreshRecommendation() {
    // 这里应该从服务器获取新的建议
    // 这里只是模拟随机选取一条建议
    const suggestions = [
      '您今天的蛋白质摄入达标，但碳水和脂肪摄入偏低。建议晚餐增加适量全谷物和健康脂肪来源，如坚果、橄榄油或鳄梨。这有助于保持血糖稳定和提供持久的能量。',
      '您今天的碳水摄入较高，建议下一餐增加蛋白质和蔬菜，减少碳水化合物。可以考虑鸡胸肉配绿叶蔬菜，避免米饭、面条等高碳水食物。',
      '您今天的脂肪摄入略高，建议选择更多不饱和脂肪酸来源，如橄榄油、坚果和鱼类，减少饱和脂肪的摄入。多摄入富含膳食纤维的食物有助于控制血脂。',
      '根据您今天的饮食记录，建议增加蔬菜水果的摄入量，尤其是深色蔬菜。每餐保证至少1/2是蔬菜，1/4是优质蛋白质，1/4是全谷物，这有助于血糖的平稳。',
      '您今天的饮食相对均衡，继续保持多样化的饮食结构很重要。建议注意食物的加工程度，选择天然、少加工的食物，对血糖控制更有利。'
    ];
    
    const randomIndex = Math.floor(Math.random() * suggestions.length);
    
    this.setData({
      recommendation: suggestions[randomIndex]
    });
    
    wx.showToast({
      title: '建议已更新',
      icon: 'success',
      duration: 1500
    });
  },
  
  // 刷新推荐食物
  refreshFoodRecommendation() {
    // 这里应该从服务器获取新的推荐食物
    // 这里只是模拟随机选取一种食物
    const recommendedFoods = [
      {
        name: '藜麦',
        calories: 120,
        carbs: 21,
        protein: 4.4,
        fat: 1.9,
        description: '藜麦是一种全谷物，富含蛋白质和膳食纤维，升糖指数较低，非常适合糖尿病患者食用。它含有完整的必需氨基酸，有助于维持血糖稳定。'
      },
      {
        name: '三文鱼',
        calories: 208,
        carbs: 0,
        protein: 20,
        fat: 13,
        description: '三文鱼富含优质蛋白质和欧米伽-3脂肪酸，这些营养素有助于降低炎症，改善胰岛素敏感性，并有益于心血管健康，对糖尿病患者非常有益。'
      },
      {
        name: '牛油果',
        calories: 160,
        carbs: 9,
        protein: 2,
        fat: 15,
        description: '牛油果富含单不饱和脂肪和膳食纤维，有助于减缓碳水化合物的消化和吸收，对稳定血糖有益。其丰富的维生素和矿物质也有助于整体健康。'
      },
      {
        name: '蓝莓',
        calories: 84,
        carbs: 21,
        protein: 1.1,
        fat: 0.5,
        description: '蓝莓含有丰富的抗氧化物质和膳食纤维，有研究表明蓝莓可以改善胰岛素敏感性，并帮助降低血糖。适量食用是糖尿病饮食的良好选择。'
      },
      {
        name: '希腊酸奶',
        calories: 130,
        carbs: 6,
        protein: 15,
        fat: 4,
        description: '希腊酸奶比普通酸奶含有更高的蛋白质和更低的碳水化合物，可以帮助控制血糖和增加饱腹感。选择无糖版本，搭配少量水果和坚果作为健康零食。'
      }
    ];
    
    const randomIndex = Math.floor(Math.random() * recommendedFoods.length);
    
    this.setData({
      recommendedFood: recommendedFoods[randomIndex]
    });
    
    wx.showToast({
      title: '推荐已更新',
      icon: 'success',
      duration: 1500
    });
  },
  
  // 添加水分摄入
  addWater() {
    wx.showToast({
      title: '水分记录功能开发中',
      icon: 'none',
      duration: 2000
    });
  },
  
  // 减少水分摄入
  decreaseWater() {
    wx.showToast({
      title: '水分记录功能开发中',
      icon: 'none',
      duration: 2000
    });
  },
  
  // 获取当前日期的格式化字符串
  getCurrentDate() {
    const today = new Date();
    const year = today.getFullYear();
    const month = String(today.getMonth() + 1).padStart(2, '0');
    const day = String(today.getDate()).padStart(2, '0');
    
    return `${year}-${month}-${day}`;
  },
  
  /**
   * 加载用户个性化营养目标
   */
  async loadNutritionTargets() {
    try {
      console.log('开始获取用户营养目标');
      console.log('可用的API函数:', Object.keys(api));
      
      const result = await api.getUserProfile();
      
      console.log('获取用户资料API返回结果:', JSON.stringify(result));
      
      if (result && result.success) {
        const userProfile = result.data;
        console.log('获取到的用户资料:', userProfile);
        
        // 检查用户是否已完善资料
        if (userProfile && userProfile.isProfileComplete === false) {
          console.log('用户尚未完善个人资料');
          this.showProfileIncompleteModal();
        }
        
        // 检查用户资料及其营养目标是否存在
        if (userProfile && userProfile.nutritionTarget) {
          const targets = userProfile.nutritionTarget;
          console.log('用户数据库中的营养目标:', targets);
          
          // 确保营养目标数据有效
          const caloriesTarget = targets.calories && !isNaN(targets.calories) ? targets.calories : 0;
          const carbsTarget = targets.carbs && !isNaN(targets.carbs) ? targets.carbs : 0;
          const proteinTarget = targets.protein && !isNaN(targets.protein) ? targets.protein : 0;
          const fatTarget = targets.fat && !isNaN(targets.fat) ? targets.fat : 0;
          
          this.setData({
            caloriesTarget,
            carbsTarget,
            proteinTarget,
            fatTarget
          });
          
          console.log('已设置营养目标:', {
            caloriesTarget,
            carbsTarget,
            proteinTarget,
            fatTarget
          });
          
          // 计算营养摄入百分比
          this.calculateNutritionPercentages();
        } else {
          console.log('用户资料中无营养目标数据');
          // 设置默认营养目标
          this.setData({
            caloriesTarget: 2200,
            carbsTarget: 275,
            proteinTarget: 110,
            fatTarget: 73
          });
          
          console.log('已设置默认营养目标');
          
          // 计算营养摄入百分比
          this.calculateNutritionPercentages();
          
          // 如果用户资料已完善但没有营养目标，显示简单提示
          if (userProfile.isProfileComplete === true) {
            wx.showToast({
              title: '使用默认营养目标',
              icon: 'none',
              duration: 2000
            });
          }
        }
      } else {
        console.log('获取用户资料失败:', result);
        // 设置默认营养目标
        this.setData({
          caloriesTarget: 2200,
          carbsTarget: 275,
          proteinTarget: 110,
          fatTarget: 73
        });
        
        console.log('由于API失败，已设置默认营养目标');
      }
    } catch (error) {
      console.error('加载营养目标失败:', error);
      // 设置默认营养目标
      this.setData({
        caloriesTarget: 2200,
        carbsTarget: 275,
        proteinTarget: 110,
        fatTarget: 73
      });
      
      console.log('由于异常，已设置默认营养目标');
      
      wx.showToast({
        title: '加载营养目标失败，使用默认值',
        icon: 'none'
      });
    }
  },
  
  /**
   * 显示用户资料未完善的提示弹窗
   */
  showProfileIncompleteModal() {
    // 检查是否已经显示过提示
    const profileTipShownToday = wx.getStorageSync('profileTipShownToday');
    const today = new Date().toDateString();
    
    // 如果今天已经显示过，则不再显示
    if (profileTipShownToday === today) {
      return;
    }
    
    wx.showModal({
      title: '完善个人资料',
      content: '完善您的个人资料可以获取更精准的营养目标和健康建议，帮助您更好地管理健康。',
      confirmText: '立即完善',
      cancelText: '稍后再说',
      success: (res) => {
        if (res.confirm) {
          // 用户点击了"立即完善"
          this.navigateToUserProfile();
        } else {
          // 记录今天已经显示过提示
          wx.setStorageSync('profileTipShownToday', today);
        }
      }
    });
  },
  
  /**
   * 计算营养摄入百分比
   */
  calculateNutritionPercentages() {
    const { calories, caloriesTarget, carbs, carbsTarget, protein, proteinTarget, fat, fatTarget } = this.data;
    
    this.setData({
      caloriesPercentage: caloriesTarget > 0 ? Math.round((calories / caloriesTarget) * 100) : 0,
      carbsPercentage: carbsTarget > 0 ? Math.round((carbs / carbsTarget) * 100) : 0,
      proteinPercentage: proteinTarget > 0 ? Math.round((protein / proteinTarget) * 100) : 0,
      fatPercentage: fatTarget > 0 ? Math.round((fat / fatTarget) * 100) : 0
    });
  },
  
  // 跳转到用户资料页面
  navigateToUserProfile() {
    wx.navigateTo({
      url: '../userDetail/userDetail',
      fail: (error) => {
        console.error('跳转到用户资料页失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none',
          duration: 2000
        });
      }
    });
  },
  
  // 切换标签页
  switchTab(e) {
    const tab = e.currentTarget.dataset.tab;
    if (tab === 'staple' || tab === 'protein' || tab === 'vegetable') {
      this.setData({
        currentTab: tab
      });
    }
  }
}) 